package com.jh.user.service;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;

import cn.jh.common.exception.ServiceException;
import cn.jh.common.pojo.BaseResponse;
import cn.jh.common.utils.BeanUtil;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.jh.user.pojo.*;
import com.jh.user.pojo.enums.CityEnums;
import com.jh.user.util.CommonsUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.jh.user.business.BankBranchBusiness;

import static org.springframework.web.bind.annotation.RequestMethod.POST;

@Controller
@EnableAutoConfiguration
public class BankBranchService {
    private static final Logger LOG = LoggerFactory.getLogger(BankBranchService.class);

    @Autowired
    BankBranchBusiness bbb;

    /*APP根据银行名称和支行名称查询支行信息*/
    @RequestMapping(method = RequestMethod.POST, value = ("/v1.0/user/app/bankbranch/query/topname"))
    public @ResponseBody Object findAll(
            @RequestParam(value = "province") String province,
            @RequestParam(value = "city") String city,
            @RequestParam(value = "topName") String topName
    ) {
        if (Objects.equals(topName, "邮储银行")) {
            topName = "邮政储蓄银行";
        }
        List<String> list = bbb.findAllBranch2(province, city, topName);
//        List<String> list = bbb.findAllBranch3(province, city, topName);
        if (list.size() > 0) {
            return CommonsUtil.returnSuccess(list);
        } else {
            return CommonsUtil.returnError("暂不支持该银行卡");
        }
    }

    /**
     * 后台
     * @param province
     * @param city
     * @param topName
     * @return
     */
    @RequestMapping(method = RequestMethod.POST, value = ("/v1.0/user/app/findAllBackGround/query/topname"))
    public @ResponseBody Object findAllBackGround(
            @RequestParam(value = "province") String province,
            @RequestParam(value = "city") String city,
            @RequestParam(value = "topName") String topName
    ) {
        if (Objects.equals(topName, "邮储银行")) {
            topName = "邮政储蓄银行";
        }
//        List<String> list = bbb.findAllBranch2(province, city, topName);
        List<String> list = bbb.findAllBranch3(province, city, topName);
        if (list.size() > 0) {
            return CommonsUtil.returnSuccess(list);
        } else {
            return CommonsUtil.returnError("暂不支持该银行卡");
        }
    }

    /*无条件查询所有的省份、直辖市、自治区*/
    @RequestMapping(method = RequestMethod.POST, value = ("/v1.0/user/app/province/queryall"))
    public @ResponseBody Object findProvince() {
        return CommonsUtil.returnSuccess(bbb.findProvince());
    }

    /*无条件查询所有的省份、直辖市、自治区*/
    @RequestMapping(method = RequestMethod.GET, value = ("/v1.0/user/app/province/queryAllProvinceAndCity"))
    public @ResponseBody Object queryAllProvinceAndCity() {
        try {
            List<Province> list = bbb.findProvince();
            List<City> cities = bbb.findAllCity();
            Map<String, ProvinceDTO> provinceHashMap = new HashMap<>();
            List<ProvinceDTO> provinceDTOS = new ArrayList<>();
            for (Province province : list) {
                ProvinceDTO provinceDTO = new ProvinceDTO();
                BeanUtil.copyPropertiesIgnoreNull(province, provinceDTO);
                provinceHashMap.put(provinceDTO.getProvinceid(), provinceDTO);
            }
            for (City city : cities) {
                if (provinceHashMap.containsKey(city.getProvinceid())) {
                    ProvinceDTO provinceDTO = provinceHashMap.get(city.getProvinceid());
                    List<City> cityList = provinceDTO.getCities();
                    if (cityList == null) {
                        cityList = new ArrayList<>();
                        String cityName = CityEnums.getCityValue(city.getProvinceid());
                        if (StringUtils.isNotBlank(cityName)) {
                            City c = new City();
                            c.setCity(cityName);
                            cityList.add(c);
                        } else {
                            cityList.add(city);
                        }
                        provinceDTO.setCities(cityList);
                    } else {
                        String cityName = CityEnums.getCityValue(city.getProvinceid());
                        if (StringUtils.isBlank(cityName)) {
                            cityList.add(city);
                        }
                    }
                }
            }
            for (String s : provinceHashMap.keySet()) {
                provinceDTOS.add(provinceHashMap.get(s));
            }
            return BaseResponse.success(provinceDTOS);
        }catch (Exception e){
            LOG.error("BankBranchService.queryAllProvinceAndCity, 查询城市异常=" + e);
            return CommonsUtil.returnError("查询城市失败！");
        }
    }

    /*联动查询城市、区、县*/
    @RequestMapping(method = RequestMethod.POST, value = ("/v1.0/user/app/city/queryall"))
    public @ResponseBody Object findCity(@RequestParam(value = "provinceid") String provinceid) {
        try {
            List<City> list = new ArrayList<City>();
//            if (provinceid.equals("110000")) {
//                City c = new City();
//                c.setCity("北京");
//                list.add(c);
//                return CommonsUtil.returnSuccess(list);
//            }
//            if (provinceid.equals("310000")) {
//                City c = new City();
//                c.setCity("上海");
//                list.add(c);
//                return CommonsUtil.returnSuccess(list);
//            }
//            if (provinceid.equals("120000")) {
//                City c = new City();
//                c.setCity("天津");
//                list.add(c);
//                return CommonsUtil.returnSuccess(list);
//            }
//            if (provinceid.equals("500000")) {
//                City c = new City();
//                c.setCity("重庆");
//                list.add(c);
//                return CommonsUtil.returnSuccess(list);
//            }
//
//            if (provinceid.equals("710000")) {
//                City c = new City();
//                c.setCity("台湾");
//                list.add(c);
//                return CommonsUtil.returnSuccess(list);
//            }
//            if (provinceid.equals("810000")) {
//                City c = new City();
//                c.setCity("香港");
//                list.add(c);
//                return CommonsUtil.returnSuccess(list);
//            }
//            if (provinceid.equals("820000")) {
//                City c = new City();
//                c.setCity("澳门");
//                list.add(c);
//                return CommonsUtil.returnSuccess(list);
//            }

            list = bbb.findCity(provinceid);
            return CommonsUtil.returnSuccess(list);
        }catch (Exception e){
            LOG.error("BankBranchService.findCity, 查询省市县异常" + e);
            return CommonsUtil.returnError("查询省市县失败！");
        }
    }

    /**
     * 根据cityId查询区/县信息
     * @param cityId
     * @return
     */
    @GetMapping(value = "/v1.0/user/app/queryAreaListByCityId")
    public @ResponseBody Object queryAreaListByCityId(String cityId) {
        try {
            if (!cityId.matches("^\\d+$")) {
                throw new ServiceException("城市选择错误！");
            }
            List<Area> list = bbb.queryAreaListByCityId(cityId);
            return CommonsUtil.returnSuccess(list, "查询成功！");
        } catch (ServiceException e) {
            e.printStackTrace();
            return CommonsUtil.returnError(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            return CommonsUtil.returnError("服务器异常，请稍后再试！");
        }
    }

    /*查询畅捷商旅支持银行列表*/
    @RequestMapping(method = RequestMethod.GET, value = ("/v1.0/user/app/bankbranch/query/all"))
    public @ResponseBody Object findAll() {
        ArrayList<Object> list = new ArrayList<>();
        list.add("中国银行");
        list.add("中国农业银行");
        list.add("中国工商银行");
        list.add("中国建设银行");
        list.add("交通银行");
        list.add("中国邮政储蓄银行");
        list.add("招商银行");
        list.add("中国民生银行");
        list.add("中信银行");
        list.add("中国光大银行");
        list.add("华夏银行");
        list.add("广发银行");
        list.add("深圳发展银行");
        list.add("兴业银行");
        list.add("浦东发展银行");
        list.add("恒丰银行");
        list.add("齐鲁银行");
        list.add("烟台商业银行");
        list.add("潍坊银行");
        list.add("临沂商业银行");
        list.add("浙商银行");
        list.add("渤海银行");
        list.add("上海银行");
        list.add("厦门银行");
        list.add("北京银行");
        list.add("福建海峡银行");
        list.add("宁波银行");
        list.add("平安银行");
        list.add("焦作市商业银行");
        list.add("温州银行");
        list.add("广州银行");
        list.add("汉口银行");
        list.add("龙江银行");
        list.add("盛京银行");
        list.add("洛阳银行");
        list.add("大连银行");
        list.add("苏州市商业银行");
        list.add("南京银行");
        list.add("东莞市商业银行");
        list.add("金华银行");
        list.add("乌鲁木齐市商业银行");
        list.add("绍兴银行");
        list.add("成都市商业银行");
        list.add("抚顺银行");
        list.add("葫芦岛市商业银行");
        list.add("郑州银行");
        list.add("宁夏银行");
        list.add("珠海华润银行");
        list.add("齐商银行");
        list.add("锦州银行");
        list.add("徽商银行");
        list.add("重庆银行");
        list.add("哈尔滨银行");
        list.add("贵阳银行");
        list.add("西安银行");
        list.add("无锡市商业银行");
        list.add("丹东银行");
        list.add("兰州银行");
        list.add("南昌银行");
        list.add("晋商银行");
        list.add("青岛商行");
        list.add("吉林市商业银行");
        list.add("九江银行");
        list.add("鞍山市商业银行");
        list.add("秦皇岛市商业银行");
        list.add("青海银行");
        list.add("台州银行");
        list.add("长沙银行");
        list.add("赣州银行");
        list.add("泉州市商业银行");
        list.add("营口市商业银行");
        list.add("阜新银行");
        list.add("嘉兴市商业银行");
        list.add("廊坊银行");
        list.add("泰隆城市信用社");
        list.add("内蒙古银行");
        list.add("湖州市商业银行");
        list.add("沧州银行");
        list.add("威海市商业银行");
        list.add("攀枝花市商业银行");
        list.add("绵阳市商业银行");
        list.add("泸州市商业银行");
        list.add("大同市商业银行");
        list.add("三门峡市商业银行");
        list.add("江苏长江商业银行");
        list.add("柳州银行");
        list.add("南充市商业银行");
        list.add("莱商银行");
        list.add("唐山市商业银行");
        list.add("六盘水商行");
        list.add("曲靖市商业银行");
        list.add("晋城银行");
        list.add("江苏银行");
        list.add("长治市商业银行");
        list.add("承德银行");
        list.add("德州银行");
        list.add("遵义市商业银行");
        list.add("邯郸市商业银行");
        list.add("安顺市商业银行");
        list.add("玉溪市商业银行");
        list.add("浙江民泰商业银行");
        list.add("上饶银行");
        list.add("东营市商业银行");
        list.add("泰安市商业银行");
        list.add("浙江稠州商业银行");
        list.add("乌海银行");
        list.add("自贡市商业银行");
        list.add("鄂尔多斯银行");
        list.add("鹤壁银行");
        list.add("许昌市商业银行");
        list.add("济宁银行");
        list.add("铁岭市商业银行");
        list.add("乐山市商业银行");
        list.add("长安银行");
        list.add("重庆三峡银行");
        list.add("石嘴山银行");
        list.add("盘锦市商业银行");
        list.add("昆仑银行");
        list.add("平顶山银行");
        list.add("朝阳市商业银行");
        list.add("遂宁市商业银行");
        list.add("保定市商业银行");
        list.add("邢台银行");
        list.add("凉山州商业银行");
        list.add("漯河商行");
        list.add("达州市商业银行");
        list.add("新乡市商业银行");
        list.add("晋中市商业银行");
        list.add("驻马店市商业银行");
        list.add("衡水市商业银行");
        list.add("周口市商业银行");
        list.add("阳泉市商业银行");
        list.add("宜宾市商业银行");
        list.add("库尔勒市商业银行");
        list.add("雅安市商业银行");
        list.add("商丘商行");
        list.add("安阳市商业银行");
        list.add("信阳银行");
        list.add("华融湘江银行");
        list.add("上海农村信用社");
        list.add("昆山农信社");
        list.add("常熟农村商业银行");
        list.add("广州农村商业银行");
        list.add("佛山顺德农村商业银行");
        list.add("湖北农村信用社");
        list.add("江阴农村商业银行");
        list.add("重庆农村商业银行");
        list.add("山东省农村信用社");
        list.add("东莞农村商业银行");
        list.add("张家港农村商业银行");
        list.add("福建省农村信用社");
        list.add("北京农村商业银行");
        list.add("天津农村商业银行");
        list.add("鄞州银行");
        list.add("成都农村商业银行");
        list.add("江苏省农村信用社");
        list.add("吴江农商行");
        list.add("浙江省农村信用社");
        list.add("珠海农村信用社");
        list.add("太仓农村商业银行");
        list.add("贵州省农村信用社");
        list.add("无锡农村商业银行");
        list.add("江西农信联合社");
        list.add("河南省农村信用社");
        list.add("陕西省农村信用社");
        list.add("广西农村信用社");
        list.add("新疆农村信用社");
        list.add("吉林农信联合社");
        list.add("黄河农村商业银行");
        list.add("安徽省农村信用社");
        list.add("青海省农村信用社");
        list.add("广东省农村信用社");
        list.add("内蒙古农村信用社");
        list.add("四川省农村信用社");
        list.add("甘肃省农村信用社");
        list.add("辽宁省农村信用社");
        list.add("山西省农村信用社");
        list.add("天津滨海农村商业银行");
        list.add("黑龙江省农村信用社");
        list.add("青岛即墨北农商村镇银行");
        list.add("浙江长兴联合村镇银行");
        list.add("深圳龙岗鼎业村镇银行");
        list.add("中山小榄村镇银行");
        list.add("深圳福田银座村镇银行");
        list.add("杭州市商业银行");
        list.add("日照银行");
        list.add("富滇银行");
        list.add("浙江泰隆商业银行");
        list.add("广西北部湾银行");
        list.add("桂林银行");
        list.add("上海农村商业银行");
        list.add("云南省农村信用社");
        list.add("河北省农村信用社");
        list.add("湖北银行");
        list.add("广州农村信用合作社");
        list.add("深圳市农村商业银行");
        list.add("景德镇商业银行");
        list.add("新疆汇和银行");
        list.add("广东华兴银行");
        list.add("江南农村商业银行");
        list.add("深圳宝安融兴村镇银行");
        list.add("南阳村镇银行");
        list.add("河北银行股份有限公司");
        list.add("包商银行");
        list.add("濮阳银行");
        list.add("宁波通商银行");
        list.add("甘肃银行");
        list.add("上海农商银行");
        list.add("青岛农信");
        list.add("福建省农村信用社联合社");
        list.add("贵州省农村信用社联合社");
        list.add("湖南省农村信用社联合社");
        list.add("海南省农村信用社联合社");
        list.add("广东南粤银行");
        list.add("无锡农村商业银行");
        list.add("枣庄银行");
        list.add("武汉农村商业银行");
        list.add("东亚银行");
        list.add("农业银行");
        list.add("工商银行");
        list.add("建设银行");
        list.add("邮政储蓄银行");
        list.add("民生银行");
        list.add("光大银行");
//        list.add("浦发银行");
        return CommonsUtil.returnSuccess(list);
    }

    @RequestMapping(method = POST, value = "/v1.0/user/bank_query/{code}")
    public @ResponseBody List<String> testQuery(@PathVariable String code, @RequestParam(value = "cityid") String cityid) throws Exception {
        List<String> result = Lists.newLinkedList();
        for (int i=1; i<1000; i++) {
            String strURL = String.format("http://www.5cm.cn/bank/%s/%d", code, i);
            URL url = new URL(strURL);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            InputStreamReader input = new InputStreamReader(httpConn
                    .getInputStream(), StandardCharsets.UTF_8);
            BufferedReader bufReader = new BufferedReader(input);
            String line;
            boolean isStart = false;
            List<String> lineList = Lists.newLinkedList();
            List<String> content = Lists.newLinkedList();
            while ((line = bufReader.readLine()) != null) {
                if (!isStart) {
                    isStart = line.contains("window.adsbygoogle");
                }
                if (isStart) {
                    if (line.contains("</table>")) {
                        break;
                    }
                    if (line.contains("td")) {
                        if (line.contains("<a")) {
                            line = line.substring(line.lastIndexOf("\">")+2, line.lastIndexOf("</a>"));
                        } else {
                            line = line.substring(line.lastIndexOf("<td>") + 4, line.lastIndexOf("</td>"));
                        }
                        content.add(line);
                        if (content.size() == 6) {
                            lineList.add(content.get(0));     //之前为Joiner.on("|").join(content)
                            content = Lists.newLinkedList();
                        }
                    }
                }
            }
            httpConn.disconnect();
            input.close();
            if (lineList.size() == 0) {
                break;
            }
            result.addAll(lineList);
        }
        LOG.info("=====result size:" + result.size());

        try{
            bbb.updateBankBranch(result,cityid);
        }catch (ServiceException e){
            LOG.error("=====异常信息：" + e.getMessage());
        }

        return result;
    }

    /**
     * 后台-获取银行列表
     * @return
     */
    @GetMapping(value = "/v1.0/user/bankBranch/getBankNameList")
    public @ResponseBody Object getBankNameList() {
        try {
            List<Map<String, Object>> list = bbb.getBankNameList();
            return CommonsUtil.returnSuccess(list, "银行列表查询成功！");
        } catch (Exception e) {
            e.printStackTrace();
            return CommonsUtil.returnError("服务器异常，请稍后再试！");
        }
    }

    /**
     * 后台-获取省-市下的支行列表信息
     * @param provinceId 省id
     * @param cityId 市id
     * @param topName 银行名称
     * @return
     */
    @GetMapping(value = "/v1.0/user/bankBranch/getBankBranchBy")
    public @ResponseBody Object getBankBranchBy(String provinceId, String cityId, String topName) {
        try {
            List<Map<String, Object>> list = bbb.getBankBranchBy(provinceId, cityId, topName);
            if (null == list) {
                return CommonsUtil.returnError("无支行信息！");
            }
            return CommonsUtil.returnSuccess(list, "支行列表查询成功！");
        } catch (Exception e) {
            e.printStackTrace();
            return CommonsUtil.returnError("服务器异常，请稍后再试！");
        }
    }
}
